package com.qf.service;

import com.qf.dao.CartDao;
import com.qf.dao.CartDaoImpl;
import com.qf.dao.GoodsDaoImpl;
import com.qf.pojo.Cart;
import com.qf.pojo.Goods;

import java.util.HashMap;
import java.util.List;

/**
 * @author 汤奇
 * @version V1.0
 * @Project BookPro
 * @Package com.qf.service
 * @Description:
 * @Date 2022/5/25 19:37
 */
public class CartServiceImpl implements CartService {
    private CartDao cartDao;
    private GoodsService goodsService = new GoodsServiceImpl(new GoodsDaoImpl());
    public CartServiceImpl(CartDao cartDao) {
        this.cartDao = cartDao;
    }

    @Override
    public boolean createCart(Integer uid, Integer pid) {

        //1.根据用户id和商品id, 到数据库中查询是否已经有这个商品的数据
        Cart cart = cartDao.findCartByUidAndPid(uid, pid);

        //根据商品id, 查询商品对象
        Goods goods = goodsService.findGoodsById(pid);

        if (cart != null){
            //2.判断如果能够查询到这个购物项数据, 进行购买数量的添加
            //购买件数+1
            cart.setNum(cart.getNum()+1);
            //总价格(商品单价*购物车加入的数量)
            cart.setMoney(goods.getPrice()*cart.getNum());
            //将商品对象放入购物车中
            cart.setGoods(goods);
            //调用dao, 将最新的购物车数据更新到表中
            cartDao.updateCart(cart);
        } else {
            //3.判断如果查不到这个购物项的数据, 那么作为新的购物项添加到数据库中
            //因为cart购物车为null, 所以需要new创建购物车对象
            cart = new Cart();
            //用户id
            cart.setUid(uid);
            //商品id
            cart.setPid(pid);
            //将商品对象放入购物车中
            cart.setGoods(goods);
            //购买数量
            cart.setNum(1);
            //总价 = 商品单价 * 购买数量
            cart.setMoney(goods.getPrice()*cart.getNum());

            //调用dao, 创建购物车
            cartDao.insertCart(cart);
        }


        return true;
    }

    @Override
    public List<Cart> findCartListByUid(Integer uid) {
        //根据用户id, 查询购物项集合
        List<Cart> cartList = cartDao.findCartListByUid(uid);
        //查询所有商品数据
        List<Goods> goodsList = goodsService.findGoodsAll();

        //这种做法效率慢, 因为遍历的次数是cartList集合的个数 乘以 goodsList集合的个数
//        if (cartList != null){
//            //遍历购物车集合
//            for (Cart cart : cartList) {
//                //遍历商品集合
//                for (Goods goods : goodsList) {
//                    if (cart.getPid() == goods.getId()){
//                        //将商品对象, 放入购物项对象中
//                        cart.setGoods(goods);
//                    }
//                }
//            }
//        }

        /**
         * 优化方案, 优化代码执行效率, 遍历次数 = cartList集合中的个数 + goodsList集合中的个数
         *  1.将数据量多的集合, 放入Map<String ,Goods>中
         *  2.遍历另一个集合, 在遍历的过程中, 直接从map中get数据
         *  时间空间复杂度:
         *      时间: 程序执行的快慢可以用时间来表示, 执行的时间越少, 说明执行效率越高, 代码越优秀
         *      空间: 程序存储需要占用磁盘或者内存空间, 当然是占用的越少越好
         *      List 时间复杂度 S=0(n)
         *      Map  时间复杂度 S=0(1)
         * */
        HashMap<String, Goods> map = new HashMap<>();
        if (goodsList != null){
            for (Goods goods : goodsList) {
                map.put(String.valueOf(goods.getId()),goods);
            }
        }
        if (cartList != null){
            for (Cart cart : cartList) {
                Goods goods = map.get(String.valueOf(cart.getPid()));
                if (goods!=null){
                    //如果商品不为空, 那么将它放入购物车中
                    cart.setGoods(goods);
                }
            }
        }
        return cartList;
    }

    @Override
    public void updateCart(Integer cid, Integer cnum) {
        //1.根据cid,到数据库查询这个购物项的数据
        Cart cart = cartDao.findById(cid);
        //2.根据查询到的购物项的商品id, 到商品表中查询对应的商品数据
        Goods goods = goodsService.findGoodsById(cart.getPid());
        //3. 重新计算总价 = 商品单价 * 商品购买数量
        cart.setGoods(goods);
        cart.setNum(cnum);
        cart.setMoney(goods.getPrice() * cart.getNum());
        cartDao.updateCart(cart);
    }

    @Override
    public void deleteById(Integer cid) {
        cartDao.deleteById(cid);
    }

    @Override
    public void clearCart(Integer uid) {
        cartDao.clearCart(uid);
    }
}
